package com.jxs.easysecurity.session;

import com.jxs.easysecurity.resource.http.UriResource;
import com.jxs.easysecurity.token.AccessToken;

import java.util.HashSet;
import java.util.Set;

/**
 * 如果你想在{@link Session}中获取一些信息，你一定要先使用{@link #isValid()}来检查该会话是否有效。
 * @author jiangxingshang
 * @since 17/6/21
 */
public class Session {

    private String userId;
    private AccessToken accessToken;
    private Set<String> resourceId = new HashSet<>(0);

    private boolean valid = true;
    private boolean login = false;

    /**
     * 创建一个已登陆的会话。
     * @param token
     * @param userId
     * @param resourceId
     */
    Session(AccessToken token, String userId, Set<String> resourceId) {
        this.accessToken = token;
        this.userId = userId;
        this.resourceId = resourceId;
        this.login = true;
    }

    /**
     * 创建一个未登陆的会话。
     * @param token
     */
    Session(AccessToken token) {
        this.accessToken = token;
        this.login = false;
    }

    private Session(boolean valid) {
        this.valid = valid;
    }

    public String getSessionId() {
        return accessToken == null ? null : accessToken.getSessionId();
    }

    public String getUserId() {
        return userId;
    }

    public AccessToken getAccessToken() {
        return accessToken;
    }

    public Set<String> getResourceId() {
        return resourceId;
    }

    public boolean hasResource(UriResource res) {
        return getResourceId().contains(res.getId());
    }

    /**
     * @return true表示会话有效。
     */
    public boolean isValid() {
        return valid;
    }

    /**
     * 如果{@link #isValid()}返回false，那么本方法一定也返回false。
     * @return
     */
    public boolean isLogin() {
        return isValid() && !isTokenExpire() && login;
    }

    /**
     * 凭证信息是否过期，如果凭证是一个无效，本方法会返回false，只有凭证有效时才能检查是否过期。
     * @return
     */
    public boolean isTokenExpire() {
        return accessToken != null && accessToken.isExpire();
    }

    static Session createInvalidSession() {
        return new Session(false);
    }
}
